#include <stdio.h>
#include "ftp_client.h"
#include <unistd.h>

volatile int terminate = 0; // 结束标志，0为不退出,1为退出

// 菜单显示
void show_menu()
{
	system("clear");
	printf("--------------------------------------\n");
	printf("command:\n");
	printf("1、get   2、put  3、ls  \n");
	printf("4、cd    5、rm   6、pwd  \n");
	printf("7、bye\n");
	printf("--------------------------------------\n");
}
int main(int argc, char *argv[])
{
	if (argc != 3)
	{
		printf(RED "please input the IP and Port!\n" RESET);
		exit(0);
	}
	// 捕获一个信号(SIGINT)Ctrl+C,把terminate置1,好处是肯定可以完成当前连接
	signal(SIGINT, sighandler);

	int sockfd = make_tcp_client(argv[1], atoi(argv[2]));
	if (sockfd == -1)
	{
		printf(RED "make_tcp_client failed\n" RESET);
		exit(0);
	}
	// 登录验证
	if (client_login(sockfd) == -1)
	{
		printf(RED "login fail!\n" RESET);
		return -1;
	}
	show_menu();
	fprintf(stderr, "ftp>");
	char buf[256];
	while (!terminate)
	{
		memset(buf, 0, 256);
		// 读取终端输入的命令(获取用户的请求)
		read(STDIN_FILENO, buf, 256);
		// 解析用户输入的命令,并且把命令按照私有协议的格式发送给服务器
		if ((strncmp(buf, "ls", 2) == 0))
		{
			cmd_ls(sockfd); // 处理ls请求
		}
		else if ((strncmp(buf, "get", 3) == 0))
		{
			// 从buf中解析出文件名
			char filename[128] = {0}; // 保存文件名
			// 把get后面的空格过滤掉
			int i = 3;
			while (buf[i] == ' ')
			{
				i++; // get dir_1
			}
			strcpy(filename, buf + i);
			filename[strlen(filename) - 1] = 0; // read(STDIN_FILENO, buf, 256);这里会吸收换行符要去掉
			printf("filename:%s\n", filename);
			// 向服务器发起请求文件
			cmd_get(sockfd, filename);
		}
		else if ((strncmp(buf, "dir_get", strlen("dir_get"))) == 0)
		{
			// 从buf中解析出文件名
			char foldername[128] = {0}; // 保存文件名
			// 把get后面的空格过滤掉
			int i = 8;
			while (buf[i] == ' ')
			{
				i++; // get dir_1
			}
			strcpy(foldername, buf + i);
			foldername[strlen(foldername) - 1] = 0; // read(STDIN_FILENO, buf, 256);这里会吸收换行符要去掉
			printf("filename:%s\n", foldername);
			// 向服务器发起请求文件
			cmd_get_folder(sockfd, foldername);
		}
		else if ((strncmp(buf, "put", 3) == 0))
		{
			// 从buf中解析出文件名
			char filename[128] = {0}; // 保存文件名
			// 把get后面的空格过滤掉
			int i = 3;
			while (buf[i] == ' ')
			{
				i++; // get dir_1
			}
			strcpy(filename, buf + i);
			filename[strlen(filename) - 1] = 0; // read(STDIN_FILENO, buf, 256);这里会吸收换行符要去掉
			printf("filename:%s\n", filename);
			// 向服务器发起请求文件
			cmd_put(sockfd, filename);
		}
		else if ((strncmp(buf, "cd", 2) == 0))
		{
			// 从buf中解析出文件名
			char filename[128] = {0}; // 保存文件名
			// 把get后面的空格过滤掉
			int i = 2;
			while (buf[i] == ' ')
			{
				i++; // get dir_1
			}
			strcpy(filename, buf + i);
			filename[strlen(filename) - 1] = 0; // read(STDIN_FILENO, buf, 256);这里会吸收换行符要去掉
			printf("will cd filename:%s\n", filename);
			// 向服务器发起请求文件
			cmd_cd(sockfd, filename);
		}
		else if ((strncmp(buf, "rm", 2) == 0))
		{
			// 从buf中解析出文件名
			char filename[128] = {0}; // 保存文件名
			// 把get后面的空格过滤掉
			int i = 2;
			while (buf[i] == ' ')
			{
				i++; // get dir_1
			}
			strcpy(filename, buf + i);
			filename[strlen(filename) - 1] = 0; // read(STDIN_FILENO, buf, 256);这里会吸收换行符要去掉
			printf("will rm filename:%s\n", filename);
			// 向服务器发起请求文件
			cmd_rm(sockfd, filename);
		}
		else if (strncmp(buf, "pwd", 3) == 0)
		{
			cmd_pwd(sockfd); // 处理pwd请求
		}
		else if (strncmp(buf, "bye", 3) == 0)
		{
			cmd_bye(sockfd); // 发送一个数据包给服务器,告诉他我断开了
			system("cowsay \"Goodbye\"");
			// system("sl -l -e -F \"Goodbye\" ");
			break;
		}
		// 等待服务器的回复
		fprintf(stderr, "ftp>");
	}
	// 关闭套接字
	close(sockfd);
	return 0;
}
